package com.sybil.spa.controlador;

import com.sybil.spa.dominio.Reembolso;
import com.sybil.spa.dominio.r12.Proveedor;
import com.sybil.spa.servicio.ReembolsoServicio;
import com.sybil.spa.servicio.TipoSolicitudServicio;
import java.beans.PropertyEditorSupport;
import java.util.Date;
import java.util.HashMap;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/reembolsos")
public class ReembolsoControlador {

   @Autowired
   private ReembolsoServicio reembolsoServicio;
   @Autowired
   private TipoSolicitudServicio tipoSolicitudServicio;

   @InitBinder
   public void binder(WebDataBinder binder) {
      binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
         @Override
         public void setAsText(String value) {
            try {
               setValue(new java.text.SimpleDateFormat("dd/MM/yyyy").parse(value));
            } catch (java.text.ParseException e) {
               setValue(null);
            }
         }

         @Override
         public String getAsText() {
            try {
               return new java.text.SimpleDateFormat("dd/MM/yyyy").format((Date) getValue());
            } catch (Exception e) {
               return "";
            }
         }
      });
   }

   @RequestMapping(method = RequestMethod.GET)
   public String reembolsoFiltros() {
      return "reembolso/filtros";
   }

   @RequestMapping(method = RequestMethod.POST)
   public String reembolsoLista(@RequestParam(required = false, value = "fd") String fechaDesde,
           @RequestParam(required = false, value = "fh") String fechaHasta,
           @RequestParam(required = false, value = "est") String estatus,
           @RequestParam(required = false, value = "nr") String numero, Model model) {
      model.addAttribute("reembolsos", reembolsoServicio.obtenerReembolsos(fechaDesde, fechaHasta, estatus, numero));
      return "reembolso/listado";
   }

   @RequestMapping(value = "/nuevo", method = RequestMethod.GET)
   public String formularioReembolsoNuevo(Model model) {
      HashMap<String, Object> info = (HashMap<String, Object>) SecurityContextHolder.getContext().getAuthentication().getDetails();
      String usuarioActual = (String) info.get("clave");
      model.addAttribute(new Reembolso());
      model.addAttribute("usuario", reembolsoServicio.getUsuario(usuarioActual));
      model.addAttribute("flujos", reembolsoServicio.obtenerFlujos(usuarioActual));
      model.addAttribute("tiposSolicitud", tipoSolicitudServicio.obtenerTiposSolicitudActivo());
      model.addAttribute("conceptosGasto", reembolsoServicio.obtenerConceptosGasto());
      model.addAttribute("tiposComprobante", reembolsoServicio.obtenerTiposComprobante());
      model.addAttribute("monedas", reembolsoServicio.obtenerMonedas());
      model.addAttribute("proveedores", reembolsoServicio.obtenerProveedores());
      model.addAttribute("impuestos", reembolsoServicio.obtenerImpuestos());
      return "reembolso/nuevo";
   }

   @RequestMapping(value = "/nuevo", method = RequestMethod.POST)
   public String reembolsoNuevo(@Valid @ModelAttribute Reembolso reembolso,
           BindingResult result, Model model,
           @RequestParam(required = false, value = "envia") String enviar,
           @RequestParam(required = false, value = "guarda") String guardar,
           @RequestParam(required = false, value = "agrega") String agrega,
           @RequestParam(required = false, value = "borra") String borra) {
      HashMap<String, Object> info = (HashMap<String, Object>) SecurityContextHolder.getContext().getAuthentication().getDetails();
      String usuarioActual = (String) info.get("clave");
//      if (agrega != null) {
//         DetalleReembolso detalleReembolso = new DetalleReembolso();
//         reembolso.getDetalles().add(detalleReembolso);
//         model.addAttribute("usuario", usuarioServicio.getUsuario(usuarioActual));
//         model.addAttribute("flujos", flujoServicio.obtenerFlujos(usuarioActual));
//         model.addAttribute("tiposSolicitud", tipoSolicitudServicio.obtenerTiposSolicitudActivo());
//         return "reembolso/nuevo";
//      } else if (borra != null) {
//         reembolso.getDetalles().remove(Integer.parseInt(borra));
//         model.addAttribute("usuario", usuarioServicio.getUsuario(usuarioActual));
//         model.addAttribute("flujos", flujoServicio.obtenerFlujos(usuarioActual));
//         model.addAttribute("tiposSolicitud", tipoSolicitudServicio.obtenerTiposSolicitudActivo());
//         return "reembolso/nuevo";
//      } else {
      if (result.hasErrors()) {
         model.addAttribute("usuario", reembolsoServicio.getUsuario(usuarioActual));
         model.addAttribute("flujos", reembolsoServicio.obtenerFlujos(usuarioActual));
         model.addAttribute("tiposSolicitud", tipoSolicitudServicio.obtenerTiposSolicitudActivo());
         model.addAttribute("conceptosGasto", reembolsoServicio.obtenerConceptosGasto());
         model.addAttribute("tiposComprobante", reembolsoServicio.obtenerTiposComprobante());
         model.addAttribute("monedas", reembolsoServicio.obtenerMonedas());
         model.addAttribute("proveedores", reembolsoServicio.obtenerProveedores());
         model.addAttribute("impuestos", reembolsoServicio.obtenerImpuestos());
         return "reembolso/nuevo";
      } else {
         try {
            reembolso.setUsuarioCreo(usuarioActual);
            reembolso.setClaveUsuario(usuarioActual);
            if (guardar != null) {
               reembolsoServicio.guardar(reembolso, false);
            } else if (enviar != null) {
               reembolsoServicio.guardar(reembolso, true);
            }
         } catch (Exception e) {
            model.addAttribute("usuario", reembolsoServicio.getUsuario(usuarioActual));
            model.addAttribute("flujos", reembolsoServicio.obtenerFlujos(usuarioActual));
            model.addAttribute("tiposSolicitud", tipoSolicitudServicio.obtenerTiposSolicitudActivo());
            model.addAttribute("conceptosGasto", reembolsoServicio.obtenerConceptosGasto());
            model.addAttribute("tiposComprobante", reembolsoServicio.obtenerTiposComprobante());
            model.addAttribute("monedas", reembolsoServicio.obtenerMonedas());
            model.addAttribute("proveedores", reembolsoServicio.obtenerProveedores());
            model.addAttribute("impuestos", reembolsoServicio.obtenerImpuestos());
            model.addAttribute("error_bd", e.getMessage() + " \n" + e.toString());
            return "reembolso/nuevo";
         }
         return "redirect:/reembolsos";
      }
//      }
   }

   @RequestMapping(value = "/edit", params = "nr", method = RequestMethod.GET)
   public String formularioReembolsoEditar(@RequestParam("nr") int numeroReembolso, Model model) {
      Reembolso reembolso = reembolsoServicio.obtenerReembolso(numeroReembolso);
      model.addAttribute(reembolso);
      HashMap<String, Object> info = (HashMap<String, Object>) SecurityContextHolder.getContext().getAuthentication().getDetails();
      String usuarioActual = (String) info.get("clave");
      model.addAttribute("usuario", reembolsoServicio.getUsuario(usuarioActual));
      model.addAttribute("flujos", reembolsoServicio.obtenerFlujos(usuarioActual));
      model.addAttribute("tiposSolicitud", tipoSolicitudServicio.obtenerTiposSolicitudActivo());
      model.addAttribute("conceptosGasto", reembolsoServicio.obtenerConceptosGasto());
      model.addAttribute("tiposComprobante", reembolsoServicio.obtenerTiposComprobante());
      model.addAttribute("monedas", reembolsoServicio.obtenerMonedas());
      model.addAttribute("proveedores", reembolsoServicio.obtenerProveedores());
      model.addAttribute("impuestos", reembolsoServicio.obtenerImpuestos());
      return "reembolso/editar";
   }

   @RequestMapping(value = "/edit", params = "nr", method = RequestMethod.POST)
   public String reembolsoEditar(@Valid @ModelAttribute Reembolso reembolso,
           BindingResult result, Model model,
           @RequestParam(required = false, value = "guarda_envia") String enviar,
           @RequestParam(required = false, value = "guarda") String guardar,
           @RequestParam(required = false, value = "agrega") String agrega,
           @RequestParam(required = false, value = "borra") String borra) {
      HashMap<String, Object> info = (HashMap<String, Object>) SecurityContextHolder.getContext().getAuthentication().getDetails();
      String usuarioActual = (String) info.get("clave");
      if (result.hasErrors()) {
         model.addAttribute("usuario", reembolsoServicio.getUsuario(usuarioActual));
         model.addAttribute("flujos", reembolsoServicio.obtenerFlujos(usuarioActual));
         model.addAttribute("tiposSolicitud", tipoSolicitudServicio.obtenerTiposSolicitudActivo());
         model.addAttribute("conceptosGasto", reembolsoServicio.obtenerConceptosGasto());
         model.addAttribute("tiposComprobante", reembolsoServicio.obtenerTiposComprobante());
         model.addAttribute("monedas", reembolsoServicio.obtenerMonedas());
         model.addAttribute("proveedores", reembolsoServicio.obtenerProveedores());
         model.addAttribute("impuestos", reembolsoServicio.obtenerImpuestos());
         return "reembolso/editar";
      } else {
         try {
            reembolso.setUsuarioModif(usuarioActual);
            if (guardar != null) {
               reembolsoServicio.editar(reembolso, false);
            } else if (enviar != null) {
               reembolsoServicio.editar(reembolso, true);
            }
         } catch (Exception e) {
            model.addAttribute("usuario", reembolsoServicio.getUsuario(usuarioActual));
            model.addAttribute("flujos", reembolsoServicio.obtenerFlujos(usuarioActual));
            model.addAttribute("tiposSolicitud", tipoSolicitudServicio.obtenerTiposSolicitudActivo());
            model.addAttribute("conceptosGasto", reembolsoServicio.obtenerConceptosGasto());
            model.addAttribute("tiposComprobante", reembolsoServicio.obtenerTiposComprobante());
            model.addAttribute("monedas", reembolsoServicio.obtenerMonedas());
            model.addAttribute("proveedores", reembolsoServicio.obtenerProveedores());
            model.addAttribute("impuestos", reembolsoServicio.obtenerImpuestos());
            model.addAttribute("error_bd", e.getMessage() + " \n" + e.toString());
            return "reembolso/editar";
         }
         return "redirect:/reembolsos";
      }
   }

   @RequestMapping(value = "/nuevo/prov", params = {"np"}, method = RequestMethod.GET)
   public @ResponseBody
   String obtenerProveedor(@RequestParam(value = "np") int numeroProveedor) {
      Proveedor proveedor = reembolsoServicio.obtenerProveedor(numeroProveedor);
      String detalleProveedor = "<script type='text/javascript'>"
              + "$('#txt_razon_social').val('" + (proveedor.getRazonSocial() == null ? "" : proveedor.getRazonSocial()) + "');"
              + "</script>";
      return detalleProveedor;
   }

   @RequestMapping(value = "/aprobar", params = {"cf", "ns"}, method = RequestMethod.GET)
   public String aprobarSolicitud(@RequestParam("cf") String claveFlujo,
           @RequestParam("ns") int numeroSolicitud, Model model) {
      model.addAttribute("solicitud", reembolsoServicio.obtenerSolicitud(claveFlujo, numeroSolicitud));
      return "reembolso/aprobar";
   }

   @RequestMapping(value = "/aprobar", params = {"cf", "ns"}, method = RequestMethod.POST)
   public String solicitudProcesar(@RequestParam("cf") String claveFlujo,
           @RequestParam("ns") int numeroSolicitud, @RequestParam("ce") String claveEvento,
           @RequestParam("txa_comentarios") String comentarios) {
      HashMap<String, Object> info = (HashMap<String, Object>) SecurityContextHolder.getContext().getAuthentication().getDetails();
      String usuarioActual = (String) info.get("clave");
      reembolsoServicio.aprobar(claveFlujo, numeroSolicitud, usuarioActual, claveEvento, comentarios);
      return "redirect:/index";
   }

   @RequestMapping(value = "/deta", params = {"cf", "ns"}, method = RequestMethod.GET)
   public String detallesSolicitud(@RequestParam("cf") String claveFlujo,
           @RequestParam("ns") int numeroSolicitud, Model model) {
      model.addAttribute("solicitud", reembolsoServicio.obtenerSolicitud(claveFlujo, numeroSolicitud));
      return "reembolso/detalle";
   }
}
